package com.jy.modules.cims.component.quota;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import com.jy.modules.cims.common.JResult;
import com.jy.modules.cims.data.common.dto.TCMmQuotaCreditDetailDTO;
import com.jy.modules.cims.data.dto.QuotaCreditDetailDto;
import com.jy.modules.cims.data.dto.QuotaCreditRightDto;
import com.jy.modules.cims.data.dto.QuotaDto;
import com.jy.modules.cims.data.dto.QuotaQueryDto;
import com.jy.modules.cims.data.interact.core.loan.response.LoanInfo;

/**
 * 额度统一管理组件，包括额度的申请，释放，分配，回收等
 */
public interface ICQuota {
	/**
	 * 根据额度编号获取额度信息
	 * 
	 * @param quotaCode
	 * @return
	 * @return Quota
	 * @author chenguixue
	 * @date 2015-1-30-下午2:11:28
	 * @update
	 */
	public QuotaDto getQuotaByCode(String quotaCode);

	/**
	 * 创建额度申请流水号
	 * 
	 * @throws Exception
	 */
	public String createQuotaCode();

	/**
	 * 分配债权信息给指定交易
	 * 
	 * @param quotaId
	 * @param crTransferId
	 * @param value
	 * @return
	 */
	public void allocCr(String quotaId, String crTransferId, BigDecimal value);

	/**
	 * 回收被分配出的债权
	 * 
	 * @param quotaId
	 * @param crTransferId
	 * @param value
	 * @return
	 */
	public void recycleCr(String quotaId, String crTransferId, BigDecimal value);

	/**
	 * 重初始债权
	 * 
	 * @param quotaId
	 * @param crTransferId
	 * @return
	 */
	public void reInitCr(String quotaId, String crTransferId);

	/**
	 * 分配贷款信息给指定交易
	 * 
	 * @param quotaId
	 * @param loanId
	 * @param value
	 * @return
	 */
	public void allocLoan(String quotaId, String loanId, BigDecimal value);

	/**
	 * 回收被分配出的贷款
	 * 
	 * @param quotaId
	 * @param loanId
	 * @param value
	 * @return
	 */
	public void recycleLoan(String quotaId, String loanId, BigDecimal value);

	/**
	 * 重初始贷款
	 * 
	 * @param quotaId
	 * @param loanId
	 * @return
	 */
	public void reInitLoan(String quotaId, String loanId);

	/**
	 * 锁定债权使用处理
	 * 
	 * @param quotaId
	 * @param crTransferId
	 * @return
	 */
	public void lockCr(String quotaId, String crTransferId);

	/**
	 * 锁定贷款使用处理
	 * 
	 * @param quotaId
	 * @param loanId
	 * @return
	 */
	public void lockLoan(String quotaId, String loanId);

	/**
	 * 根据额度申请条件，创建额度申请
	 * 
	 * @param dto
	 *            额度申请条件
	 * @return
	 */
	public JResult saveQuotaApply(QuotaDto dto);

	/**
	 * 开启额度申请
	 * 
	 * @param quotaCode
	 *            额度流水号
	 * @return
	 */
	public JResult startWork(String quotaCode) throws Exception;

	/**
	 * 根据额度查询条件返回额度交易流水
	 * 
	 * @param dto
	 * @return
	 * @return List<QuotaDto>
	 * @author chenguixue
	 * @date 2015-1-29-下午2:29:25
	 * @update
	 */
	public List<QuotaDto> getQuotaList(QuotaQueryDto dto);

	/**
	 * 获得额度明细列表
	 * 
	 * @param dto
	 * @return
	 */
	public List<Object> getQuotaDetailList(QuotaQueryDto dto);

	/**
	 * 保存额度申请明细
	 * 
	 * @param dto
	 * @return
	 */
	public void saveQuotaList(List<QuotaCreditRightDto> dto) throws Exception;

	/**
	 * 删除额度申请
	 * 
	 * @param quotaCode
	 * @return
	 */
	public void deleteQuota(String quotaCode, List<Object> detailList) throws Exception;

	/**
	 * 保存接口过来的贷款
	 * 
	 * @param loanInfoDataList
	 * @return void
	 * @author chenguixue
	 * @throws Exception
	 * @date 2015-1-27-下午5:56:33
	 * @update
	 */
	public void saveLoanFromInteract(List<LoanInfo> loanInfoDataList,
			String sysCode) throws Exception;

	/**
	 * 额度申请结束<br/>
	 * 适用于手工结束额度申请场景下
	 * 
	 * @return void
	 * @author chenguixue
	 * @date 2015-1-29-上午10:17:19
	 * @update
	 */
	public void endQuota(List<String> quotaCodeList);

	/**
	 * 额度申请结束<br/>
	 * 适用于系统根据指定规则自动结束额度申请场景下
	 * 
	 * @param endDate
	 * @return void
	 * @author chenguixue
	 * @date 2015-1-29-上午10:32:01
	 * @update
	 */
	public void endQuota(Date endDate);

	/**
	 * 根据额度编号对额度明细进行作废，并返回作废的明细编号
	 * 
	 * @param quotaCode
	 * @return List<String> 作废的明细编号列表
	 * @author chenguixue
	 * @date 2015-1-30-上午11:55:49
	 * @update
	 */
	public List<Object> cancelQuotaDetailByQuota(String quotaCode,
			List<Object> detailList);
	
	/**
	 * 根据合同编号对额度明细进行作废，并返回作废的明细编号
	 * 
	 * @param quotaCode
	 * @return List<String> 作废的明细编号列表
	 * @author chenguixue
	 * @date 2015-1-30-上午11:55:49
	 * @update
	 */
	public List<Object> cancelQuotaDetailByQuotaDetail(String contractNo,
			List<Object> detailList,String riskTimeString);

	/**
	 * 根据额度类型和额度明细进行明细作废
	 * 
	 * @param quotaType
	 * @param detailCode
	 * @return void
	 * @author chenguixue
	 * @date 2015-1-30-下午2:01:29
	 * @update
	 */
	public void cancelQuotaDetailByList(String quotaType,
			List<String> detailCode);

	/**
	 * 根据合作机构与合约编号查询额度申请债权明细
	 * 
	 * @Title searchQuotaCreditDetailByPaging
	 * @Description TODO
	 * @param searchParams
	 * @return List<TCMmQuotaCreditDetailDTO>
	 * @author lizhiqiang
	 * @date 2015-2-2-上午11:59:58
	 * @update
	 * @throws
	 */
	public List<QuotaCreditDetailDto> searchQuotaCreditDetailByPaging(
			Map<String, Object> searchParams);
	
	/**
	 * 根据合作机构与合约编号查询额度申请所有的债权明细
	 * @Title searchQuotaCreditDetail
	 * @Description TODO
	 * @param searchParams
	 * @return 
	 * List<QuotaCreditDetailDto> 
	 * @author lizhiqiang
	 * @date 2015-8-13-下午8:03:03
	 * @update 
	 * @throws
	 */
	public List<QuotaCreditDetailDto> searchQuotaCreditDetail(
			Map<String, Object> searchParams);
	
    /**
     * 统计标的日期债权价值
     * @Title searchTotalQuotaCreditDetail
     * @Description TODO
     * @param searchParams
     * @return 
     * Integer 
     * @author lizhiqiang
     * @date 2015-8-13-下午8:31:43
     * @update 
     * @throws
     */
    public BigDecimal searchTotalQuotaCreditDetail(Map<String, Object> searchParams);
	/**
	 * 单笔查询分配的债权额度
	 * @Title doSingleGetCreditRightQuotaApplyResult
	 * @Description TODO
	 * @param tcMmQuotaDTO
	 * @throws Exception 
	 * void 
	 * @author lizhiqiang
	 * @date 2015-5-14-下午4:24:44
	 * @update 
	 * @throws
	 */
	public void doSingleGetCreditRightQuotaApplyResult(QuotaDto tcMmQuotaDTO) throws Exception;
	
	/**
	 * 获取数据不存在贷款信息表的记录
	 * 
	 * @param quotaCode
	 * @param loanInfoList
	 * @return
	 */
	public List<LoanInfo> getNotExistLoanInfoList(String quotaCode, List<LoanInfo> loanInfoList);
	
	/**
	 * 新增贷款申请信息
	 * 
	 * @param quotaDto
	 * @throws Exception
	 */
	public void addLoantQuotaApply(QuotaDto quotaDto) throws Exception;
	
	/**
	 * 额度取消
	 * 
	 * @param quotaDto
	 */
	public void quotaCancel(QuotaDto quotaDto);
	
	/**
	 * 额度明细释放
	 * 
	 * @param quotaDto
	 * @param detailList
	 */
	public void quotaDetailUnlock(QuotaDto quotaDto, List<Object> detailList);
	
	/**
	 * 根据额度申请编号更新申请状态
	 * 
	 * @param quotaCode
	 */
	public void updateQuotaStatusByQuotaCode(String quotaCode);

	/**
	 * 查询额度债权明细
	 * @author zhangmi
	 * @date  2017年3月10日
	 * @param searchParams
	 * @return
	 */
	public List<TCMmQuotaCreditDetailDTO> searchTCMmQuotaCreditDetail(Map<String, Object> searchParams);
	/**
	 * 
	 * @author zhangmi
	 * @date  2017年3月9日
	 * @param quotaCode 额度编号
	 * @param quotaStatus 修改的额度状态
	 */
	public void updateCancelQuotaStatusByQuotaCode(String quotaCode,String quotaStatus);
	/**
	 * 作废额度债权
	 * @author zhangmi
	 * @date  2017年3月10日
	 * @param quotaCode  额度编号
	 * @param oldDealStatus 需要作废的状态
	 */
	public void updateCncelQuotaCRDetailByQuota(String quotaCode,String oldDealStatus) ;
}